#pragma once

#include <stdint.h>
#include "common/EZType_traits.h"

HAS_MEMBER(size)

template<typename T>
inline typename std::enable_if<!has_size<T>::value && !std::is_integral<T>::value, bool>::type
is_null_value(const T& v) 
{
    return false;
}

template<typename T>
inline typename std::enable_if<has_size<T>::value, bool>::type is_null_value(const T& v) 
{
    return v.size() == 0;
}

template<typename T, size_t N>
bool is_null_value(const T(&v)[N]) {
    for (size_t i = 0; i < N; ++i) {
        if (!is_null_value(v[i])) {
            return false;
        }
    }
    return true;
}

template<typename T>
typename std::enable_if<std::is_integral<T>::value, bool>::type is_null_value(T v) {
    return v == 0;
}

inline bool is_null_value(float v) {
    return v == 0.;
}
inline bool is_null_value(double v) {
    return v == 0.;
}
inline bool is_null_value(const char* v) {
    return v == 0 || v[0] == 0;
}
inline bool is_null_value(const unsigned char* v) {
    return v == 0 || v[0] == 0;
}
inline bool is_null_value(const std::string& v) {
    return v == "";
}


